package com.hnqcgc.dao;

import com.hnqcgc.db.MyTransaction;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/***
 * 统一完成JDBC 操作
 */
public class BaseDao {
    //事务对象
    private MyTransaction myTransaction;
    //连接对象
    private Connection conn;
    //预处理对象
    private PreparedStatement pstm;
    // 返回查询结果集
    private ResultSet rs;

    //构造方法，完成事务初始化
    public BaseDao(MyTransaction myTransaction){
        this.myTransaction=myTransaction;
        this.conn=this.myTransaction.getConn();
    }
    //无参构造
    public BaseDao(){

    }
    //set方法 给事务和连接对象赋值
    public void  setMyTransaction(MyTransaction myTransaction){
        this.myTransaction=myTransaction;
        this.conn=this.myTransaction.getConn();
    }

    /***
     * 统一绑定参数  给？赋值
     * @param pstm
     * @param obj  可变长度 参数
     */
    public void bindParmas(PreparedStatement pstm,Object ...obj){
        if(obj!=null&&obj.length>0){
            //绑定参数
            for(int i=1;i<=obj.length;i++){
                try {
                    pstm.setObject(i,obj[i-1]);
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }

    /***
     * 统一释放资源
     */
    public void closeResource(){
        try {
            if(pstm!=null&&!pstm.isClosed()){
                pstm.close();
            }
            if(rs!=null&&!rs.isClosed()){
                rs.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    /***
     * 统一完成 新增 修改 删除 ， 返回受影响行数
     * @param sql  预编译sql语句
     * @param obj  可变长度参数
     * @return   返回受影响行数
     */
    public int update(String sql,Object ...obj){
        try {
            //通过连接对象获得预编译对象
            pstm=this.conn.prepareStatement(sql);
            //统一动态绑定参数
            bindParmas(pstm,obj);
            //执行sql 返回长度
            int count=pstm.executeUpdate();
            return count;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return -1;
        }
    }

    /***
     * 统一完成 查询，返回结果集
     * @param sql  预编译sql
     * @param obj  可变长度参数
     * @return  结果集
     */
    public ResultSet query(String sql,Object ...obj){
        try {
            pstm=this.conn.prepareStatement(sql);
            bindParmas(pstm,obj);
            rs=pstm.executeQuery();
            return rs;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }
    }

}
